package com.java.streamdemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.io.Writer;

import org.junit.jupiter.api.Test;

public class Streamdemo {
	@Test

	public void test01() {
		/**
		 * 字节流：先读入cpu，再写入指定文件中
		 */
		// 创建一个要读入的文件，创建一个要写出的指定文件
		try (InputStream is = new FileInputStream("E:/temp/streamdemo/str.txt");
				// 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true，则将字节写入文件末尾处，而不是写入文件开始处。
				OutputStream out = new FileOutputStream("E:/temp/streamdemo/str1.txt", true);) {
			// 创建一个字节型byte数组来写入
			byte[] c = new byte[1024];
			// 读入CPU
			int i = is.read(c);
			// 进入while循环
			// 如果 i 为 0，则不读取任何字节并返回 0；
			// 否则，尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节，则返回值 -1；
			// 即一直读取，直到到最后一个字节
			while (i != -1) {
				// 写出到指定文件
				System.out.println(new String(c, "gbk"));
				out.write(c, 0, i);
				// 继续向下读取
				i = is.read(c);
			}

		} catch (IOException e) {

			e.printStackTrace();
		}
	}

	@Test

	public void test02() {
		/**
		 * 字符流：先读入cpu，再写入指定文件中
		 */
		// 创建一个要读入的文件，创建一个要写出的指定文件
		try (Reader is = new FileReader("E:/temp/streamdemodemo/tt.txt");
				// 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true，则将字节写入文件末尾处，而不是写入文件开始处。
				Writer out = new FileWriter("E:/temp/streamdemodemo/tt1.txt", true);) {
			// 创建一个字符型char数组来写入
			char[] c = new char[1024];
			// 将字符读入数组
			int i = is.read(c);
			// 进入while循环
			// 如果 i 为 0，则不读取任何字节并返回 0；
			// 否则，尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节，则返回值 -1；
			// 即一直读取，直到到最后一个字节
			while (i != -1) {
				// 写出到指定文件
				System.out.println(new String(c));
				out.write(c, 0, i);
				// 继续向下读取
				i = is.read(c);
			}

		} catch (IOException e) {

			e.printStackTrace();
		}
	}

	@Test
	public void test03() {
		/**
		 * 缓冲流：将字节流转换为字符型
		 */
		try ( // 创建一个数据输入流
				BufferedReader br = new BufferedReader(
						new InputStreamReader(new FileInputStream("E:/temp/buffered/bu.txt"), "utf-8"));
				// 创建一个数据输出流
				//构造方法的第二个参数决定写入文件的内容是接着写还是从开头覆盖写； 默认为false，从开头覆盖写；true，从末位接着写
				BufferedWriter br1 = new BufferedWriter(
						new OutputStreamWriter(new FileOutputStream("E:/temp/buffered/bu1.txt", false), "utf-8"));) {
			// 将输入流中的内容输入到存储区
			String str = br.readLine();
			while (str != null) {
				System.out.println(str);
				br1.write(str);
				// 换行
				br1.newLine();
				str = br.readLine();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
